﻿using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;

namespace Trunk.Jogo.Core
{
    /// <summary>
    /// Colisão por pixel da moto
    /// </summary>
    class Colisao
    {
        Color[] Dados1;
        Color[] Dados2;

        public bool hit = false;

        Vector2 posicao1;
        Vector2 posicao2;

        Texture2D textura1;
        Texture2D textura2;

        string text1;
        string text2;

        Vector2 textuConf1;
        Vector2 textuConf2;

        public Colisao(ContentManager Content, GameWindow Window, string text1, string text2)
        {
            this.text1 = text1;
            this.text2 = text2;

            textura1 = Content.Load<Texture2D>(text1);
            textura2 = Content.Load<Texture2D>(text2);
        }

        public bool Update(GameTime gameTime, Vector2 posicao1, Vector2 posicao2, Vector2 textuConf1, Vector2 textuConf2)
        {
            this.posicao1 = posicao1;
            this.posicao2 = posicao2;

            this.textuConf1 = textuConf1;
            this.textuConf2 = textuConf2;


            Dados1 = new Color[textura1.Width * textura1.Height];
            textura1.GetData(Dados1);

            Dados2 = new Color[textura2.Width * textura2.Height];
            textura2.GetData(Dados2);

            Rectangle Retangulo1 = new Rectangle((int)posicao1.X, (int)posicao1.Y, (int)textuConf1.X, (int)textuConf1.Y);

            Rectangle Retangulo2 = new Rectangle((int)posicao2.X, (int)posicao2.Y, (int)textuConf2.X, (int)textuConf2.Y);

            hit = false;

            if (ColisaoPorPixel(Retangulo1, Dados1, Retangulo2, Dados2))
            {
                hit = true;
            }

            return hit;
        }

        public bool ColisaoPorPixel(Rectangle retangulo1, Color[] dados1, Rectangle retangulo2, Color[] dados2)
        {
            int cima = Math.Max(retangulo1.Top, retangulo2.Top);
            int baixo = Math.Min(retangulo1.Bottom, retangulo2.Bottom);
            int esquerda = Math.Max(retangulo1.Left, retangulo2.Left);
            int direita = Math.Min(retangulo1.Right, retangulo2.Right);

            for (int y = cima; y < baixo; y++)
            {
                for (int x = esquerda; x < direita; x++)
                {
                    Color color1 = dados1[(x - retangulo1.Left) + (y - retangulo1.Top) * retangulo1.Width];
                    Color color2 = dados2[(x - retangulo2.Left) + (y - retangulo2.Top) * retangulo2.Width];

                    if (color1.A != 0 && color2.A != 0)
                    {
                        return true;
                    }
                }
            }

            return false;
        }
    }
}
